home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / ds3100.md / Sync_Unlock.s < prev   
Text File  |  1989-07-08  |  3KB  |  91 lines

  1. /*
  2.  * Sync_Unlock.s --
  3.  *
  4.  *    Source code for the Sync_Unlock library procedure.
  5.  *
  6.  * Copyright (C) 1989 by Digital Equipment Corporation, Maynard MA
  7.  *
  8.  *            All Rights Reserved
  9.  *
  10.  * Permission to use, copy, modify, and distribute this software and its 
  11.  * documentation for any purpose and without fee is hereby granted, 
  12.  * provided that the above copyright notice appear in all copies and that
  13.  * both that copyright notice and this permission notice appear in 
  14.  * supporting documentation, and that the name of Digital not be
  15.  * used in advertising or publicity pertaining to distribution of the
  16.  * software without specific, written prior permission.  
  17.  *
  18.  * Digitial disclaims all warranties with regard to this software, including
  19.  * all implied warranties of merchantability and fitness.  In no event shall
  20.  * Digital be liable for any special, indirect or consequential damages or
  21.  * any damages whatsoever resulting from loss of use, data or profits,
  22.  * whether in an action of contract, negligence or other tortious action,
  23.  * arising out of or in connection with the use or performance of this
  24.  * software.
  25.  *
  26.  * Header: Sync_GetLock.s,v 1.1 88/06/19 14:34:17 ouster Exp $ SPRITE (DECWRL)
  27.  */
  28.  
  29. #ifdef KERNEL
  30. #include <regdef.h>
  31. #include "machConst.h"
  32. #else
  33. #include <regdef.h>
  34. #include "kernel/machConst.h"
  35. #endif
  36.  
  37.  
  38. /*
  39.  *----------------------------------------------------------------------------
  40.  *
  41.  * Sync_Unlock --
  42.  *
  43.  *      Release a lock.  This is called at the end of a critical
  44.  *      section of code to allow other processes to execute within the
  45.  *      critical section.  If any processes are waiting to acquire this
  46.  *      lock they are made runnable.  They will try to gain the lock
  47.  *      again the next time they run.
  48.  *
  49.  * Results:
  50.  *    None.
  51.  *
  52.  * Side effects:
  53.  *    The lock is cleared.  Processes waiting on the lock are made runnable.
  54.  *
  55.  * C equivalent:
  56.  *
  57.  *    void
  58.  *    Sync_Unlock(lockPtr)
  59.  *        Sync_Lock *lockPtr;
  60.  *    {
  61.  *        lockPtr->inUse = 0;
  62.  *        if (lockPtr->waiting) {
  63.  *        Sync_SlowBroadcast((int)lockPtr, &lockPtr->waiting);
  64.  *        }
  65.  *    }
  66.  *
  67.  *----------------------------------------------------------------------------
  68.  */
  69.     .globl Sync_Unlock
  70. Sync_Unlock:
  71.     sw        zero, 0(a0)    # lockPtr->inUse = 0
  72.  
  73.     /*
  74.      * The check on the waiting bit races with the assignment
  75.      * statement that clears it in Sync_SlowBroadcast. In the
  76.      * worst case we assume someone is waiting that is really
  77.      * just waking up because we've cleared the inUse bit.
  78.      * That results in a wasted call to Sync_SlowBroadcast.
  79.      */
  80.     lw        t0, 4(a0)    # if (lockPtr->waiting)
  81.     beq        t0, zero, 1f    # Bail out if !lockPtr->waiting
  82.  
  83.     /*
  84.      * Note the broadcast semantics for Sync_SlowBroadcast.
  85.      * All processes waiting on the lock will be made runnable,
  86.      * however, all but one will sleep again inside Sync_SlowLock.
  87.      */
  88.     add        a1, a0, 4    # Pass address of lockPtr->waiting as 2nd arg
  89.     j        Sync_SlowBroadcast
  90. 1:  j         ra
  91.